{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "b668f687",
   "metadata": {},
   "source": [
    "### 7.2 主成分分析"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04c3ddea",
   "metadata": {},
   "source": [
    "#### 7.2.3 对iris数据集进行主成分分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "8415249f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.datasets import load_iris\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 步骤1：导入数据集\n",
    "iris = load_iris()\n",
    "X = iris.data\n",
    "y = iris.target\n",
    "\n",
    "# 步骤2：标准化数据\n",
    "X_scaled = StandardScaler().fit_transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "45e2f84c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-0. -0. -0. -0.]\n",
      "[1. 1. 1. 1.]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "print(np.round(np.mean(X_scaled,axis=0),2)) # 查看各变量平均值\n",
    "print(np.round(np.std(X_scaled,axis=0),2)) # 查看各变量标准差"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "a3250b49",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "各主成分方差贡献度 [0.72962445 0.22850762 0.03668922 0.00517871]\n",
      "主成分累积方差贡献度 [0.72962445 0.95813207 0.99482129 1.        ]\n"
     ]
    }
   ],
   "source": [
    "# 步骤3：进行主成分分析\n",
    "pca = PCA()\n",
    "X_pca = pca.fit_transform(X_scaled)\n",
    "\n",
    "# 计算主成分方差贡献度\n",
    "explained_variance_ratio = pca.explained_variance_ratio_\n",
    "cumulative_variance_ratio = explained_variance_ratio.cumsum()\n",
    "print('各主成分方差贡献度',explained_variance_ratio)\n",
    "print('主成分累积方差贡献度',cumulative_variance_ratio)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "cf9cd1c2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 步骤4：绘制碎石图\n",
    "plt.figure(figsize=(12,6))\n",
    "plt.plot(range(1, len(cumulative_variance_ratio) + 1), cumulative_variance_ratio, marker='o')\n",
    "plt.title('Scree Plot')\n",
    "plt.xlabel('Number of Principal Components')\n",
    "plt.ylabel('Cumulative Explained Variance')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "395c124c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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rU0vv/yypk2bppkzZ0qSnn32Wd14442aNm2aHn30Ud1+++1avXq1du7cqSlTpmjq1KmSpLlz5+qGG27Qcccdp4cffljz5s3Tvffeq5kzZ+qcc87R7Nmz94tj48aNOuqooyRJBxxwgA455BBt3rxZhx12WFGvSyJ5bhwLFuz9R5G2fXuwn+QZAIDGVYUcwd112WWX6f7771dTU5M2btyol156SZLU3t6uadOmSZJWrFihWbNmqbm5Wc3NzTr33HMlSdu2bdODDz6o8847b885d+zYUZbYCkXy3Cg2bChsPwAAaAxVyBFSqZQ2bdqklStXauTIkero6NjTHu7ggw8e9vjBwUEdeuihe0ayozryyCP1wgsvaNy4cdq1a5dee+01jRkzppiXsAc1z41i/PjC9gMA0ED6+qQJE6QXX4w7khhUIEdobW3V1q1b92y/9tprOvzwwzVy5Ejdd999Wr9+fdbjpk+frrvuukv9/f3atm2b7r77bklSW1ubjj76aN16662SgpHs1atXZ71WppkzZ+rGG2+UJN12221697vfXXILP5LnRrFwodTSsu++lpZgPwAADa67W1q3LrhvOBXIEcaMGaPp06dr4sSJmj9/vrq6utTT06NJkybppptu0gknnJD1uNNPP10zZ87UKaecorPPPluTJk3SIYccIikYvV68eLFOPfVUnXzyyXsmHV5wwQW65pprdNppp+03YfAv//IvtXnzZh177LG69tprdfXVVxf9mtKs1BmH1dTZ2ek9PT1xh1G7UqmgfmnDhuDb5MKF1DsDABpeX590zDFSf7900EHS889LRxwRd1Sleeqpp3TiiSdGPyBBOcK2bds0evRobd++XWeccYYWLVqkKVOmVPSa2d4vM1vp7p1Dn0vNcyPp6iJZBgBgiO5uKd1eePfuYPu66+KNqeoSlCPMnTtXa9asUX9/v+bMmVPxxLlQJM8AAKBh9fVJS5ZIAwPB9sBAsH355cOPPvf1STNmSCtW1P5IdZLccsstcYeQFzXPAACgYWWOOqelR5+jHNuwddINjOQZAAA0rGXL9o46pw0MSOFctJzSI9aDg8F9Q3bpaFAkzwAAoGH19kru+996e/Mfl61OGo2B5BkAAKAAueqkGX1uDCTPAAAABSilTrpRvPrqq7r++uurcq0777xTa9asyfrY/fffrylTpuiAAw7QbbfdVpbrkTwDAAAUoNg66UZSTPLs7hoc+q0kgnzJ8/jx4/Wd73xHH/7whws+by60qgMAACjAcPXQtabtqjZtHdh/eevWUa3acumWos55ySWXaO3atZo8ebL+9E//VFdccYVmzZql3//+99q5c6e++tWvatasWVq3bp3e+9736m1ve5tWrlypH/3oR7rpppt08803a+zYsTrqqKM0depUff7zn9fatWv1mc98Rps2bVJLS4v+4z/+Q6+88oqWLVum5cuX66tf/apuv/12TZgwYU8cHR0dkqSmpvKNF5M8AwAANLBsiXO+/VFcffXVeuKJJ7Rq1SpJ0q5du3THHXeora1NL7/8sqZNm6aZM2dKkp599lndeOONmjZtmh599FHdfvvtWr16tXbu3KkpU6Zo6tSpkoLFU2644QYdd9xxevjhhzVv3jzde++9mjlzps455xzNnj276HgLQfIMAACAinJ3XXbZZbr//vvV1NSkjRs36qWXXpIktbe3a9q0aZKkFStWaNasWWpublZzc7POPfdcScGS3Q8++KDOO++8PefcsWNH9V+ISJ4BAABQYalUSps2bdLKlSs1cuRIdXR0qL+/X5J08MEHD3v84OCgDj300D0j2XFiwiAAAADKqrW1VVu37i37eO2113T44Ydr5MiRuu+++7R+/fqsx02fPl133XWX+vv7tW3bNt19992SpLa2Nh199NG69dZbJQUj2atXr856rUojeQYAAEBZjRkzRtOnT9fEiRM1f/58dXV1qaenR5MmTdJNN92kE044Ietxp59+umbOnKlTTjlFZ599tiZNmqRDDjlEUjB6vXjxYp166qk6+eSTtTRsb3LBBRfommuu0Wmnnaa1a9fuc75HH31U48aN06233qpPfepTOvnkk0t+bebuJZ+kWjo7O72npyfuMAAAABLtqaee0oknnhjpuZXotlGKbdu2afTo0dq+fbvOOOMMLVq0SFOmTKnoNbO9X2a20t07hz6XmmcAAIAGFkeCnM/cuXO1Zs0a9ff3a86cORVPnAtF8gwAAIDEuOWWW+IOIS9qngEAAICISJ4BAACAiEieAQAAgIhIngEAAICISJ4BAABQVq+++qquv/76qlzrzjvv1Jo1a7I+du211+qkk07SKaecojPPPDPn4iyFIHkGAABAWRWTPLu7BgcHC75WvuT5tNNOU09Pjx577DHNnj1bX/jCFwo+/1Akz0mXSkkdHVJTU3CfSsUdEQAAqEN9fdKECdKLL5Z+rksuuURr167V5MmTNX/+fG3btk1nnnmmpkyZokmTJu1ZHXDdunU6/vjj9bGPfUwTJ07UCy+8oO7ubh1//PGaMWOGLrzwQn3ta1+TJK1du1ZnnXWWpk6dqre//e16+umn9eCDD2rZsmWaP3++Jk+evN8Kg+9617vU0tIiSZo2bZp6e3tLfm30eU6yVEqaO1favj3YXr8+2Jakrq744gIAAHWnu1taty64v+660s519dVX64knntCqVaskSbt27dIdd9yhtrY2vfzyy5o2bZpmzpwpSXr22Wd14403atq0aXr00Ud1++23a/Xq1dq5c6emTJmiqVOnSgoWT7nhhht03HHH6eGHH9a8efN07733aubMmTrnnHM0e/bsvDEtXrxYZ599dmkvTCTPybZgwd7EOW379mA/yTMAACiTvj5pyRJpcDC4v/xy6Ygjynd+d9dll12m+++/X01NTdq4caNeeuklSVJ7e7umTZsmSVqxYoVmzZql5uZmNTc369xzz5UULNn94IMP6rzzzttzzh07dkS+/s0336yenh4tX7685NdC8pxkGzYUth8AAKAI3d1B4ixJu3eXZ/Q5UyqV0qZNm7Ry5UqNHDlSHR0d6u/vlyQdfPDBwx4/ODioQw89dM9IdiHuueceLVy4UMuXL9eBBx5Y8PFDUfOcZOPHF7YfAACgQOlR54GBYHtgINgupfa5tbVVW7du3bP92muv6fDDD9fIkSN133335ex6MX36dN11113q7+/Xtm3bdPfdd0uS2tradPTRR+vWW2+VFIxkr169Ouu1Mv3617/Wpz71KS1btkyHH3548S8oA8lzki1cKIVF7nu0tAT7AQAAyiBz1DktPfpcrDFjxmj69OmaOHGi5s+fr66uLvX09GjSpEm66aabdMIJJ2Q97vTTT9fMmTN1yimn6Oyzz9akSZN0yCGHSApGrxcvXqxTTz1VJ5988p5JhxdccIGuueYanXbaaftNGExPVjzvvPM0efLkPXXWpTB3L/kk1dLZ2ek9PT1xh1FdqVRQ47xhQzDivHAh9c4AACCvp556SieeeGKk544bJ23cuP/+I4+UytCcomDbtm3T6NGjtX37dp1xxhlatGiRpkyZUtFrZnu/zGylu3cOfS41z0nX1UWy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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 步骤5：选择主成分数量\n",
    "# 根据碎石图的肘部来确定要保留的主成分数量\n",
    "\n",
    "# 步骤6：使用选择的主成分数量进行数据变换\n",
    "n_components = 2  # 选择要保留的主成分数量\n",
    "pca_selected = PCA(n_components=n_components)\n",
    "X_pca_selected = pca_selected.fit_transform(X_scaled)\n",
    "\n",
    "# 步骤7：可视化降维后的数据\n",
    "plt.figure(figsize=(12,6))\n",
    "# 根据分组设置颜色和标记\n",
    "colors = ['red', 'green', 'blue']\n",
    "markers = ['o', 's', '^']\n",
    "# 绘制散点图\n",
    "for group in range(3):\n",
    "    plt.scatter(X_pca_selected[:, 0][y==group], X_pca_selected[:, 1][y==group],\n",
    "                c=colors[group], marker=markers[group], label=f'target {group}')\n",
    "plt.title('PCA: 2 Principal Components')\n",
    "plt.xlabel('Principal Component 1')\n",
    "plt.ylabel('Principal Component 2')\n",
    "plt.legend()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "77894b2e",
   "metadata": {},
   "source": [
    "### 7.3 关联规则分析"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82345a29",
   "metadata": {},
   "source": [
    "#### 7.3.3 对用户购买物品进行关联规则分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "f92d15b9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>player_id</th>\n",
       "      <th>product_name</th>\n",
       "      <th>qty</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>107204535</td>\n",
       "      <td>感恩大礼包</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>107204535</td>\n",
       "      <td>新手礼包</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>213666611</td>\n",
       "      <td>8条钥匙</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>226500629</td>\n",
       "      <td>0.1元大礼包</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>226500629</td>\n",
       "      <td>8条钥匙</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   player_id product_name  qty\n",
       "0  107204535        感恩大礼包    1\n",
       "1  107204535         新手礼包    1\n",
       "2  213666611         8条钥匙    1\n",
       "3  226500629      0.1元大礼包    1\n",
       "4  226500629         8条钥匙    1"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#  导入数据集\n",
    "import numpy as np\n",
    "import pandas as pd \n",
    "df = pd.read_excel('data/玩家购物数据.xlsx') # 导入csv文件\n",
    "df.head() # 查看前五行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "d31e5d9c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>player_id</th>\n",
       "      <th>items</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>107204535</td>\n",
       "      <td>[感恩大礼包, 新手礼包]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>213666611</td>\n",
       "      <td>[8条钥匙]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>226500629</td>\n",
       "      <td>[0.1元大礼包, 8条钥匙, 限量版角色]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>230329140</td>\n",
       "      <td>[38000金币, 限量版角色, 新手礼包]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>264162836</td>\n",
       "      <td>[50条钥匙]</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   player_id                   items\n",
       "0  107204535           [感恩大礼包, 新手礼包]\n",
       "1  213666611                  [8条钥匙]\n",
       "2  226500629  [0.1元大礼包, 8条钥匙, 限量版角色]\n",
       "3  230329140  [38000金币, 限量版角色, 新手礼包]\n",
       "4  264162836                 [50条钥匙]"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将数据转换为事务型数据集\n",
    "transactions = df.groupby('player_id')['product_name'].apply(list).reset_index(name='items')\n",
    "transactions.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "e1f53f90",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0.1元大礼包</th>\n",
       "      <th>10块滑板</th>\n",
       "      <th>15000金币</th>\n",
       "      <th>15元大礼包</th>\n",
       "      <th>1条钥匙</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>player_id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>107204535</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>213666611</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>226500629</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>230329140</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>264162836</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           0.1元大礼包  10块滑板  15000金币  15元大礼包   1条钥匙\n",
       "player_id                                        \n",
       "107204535    False  False    False   False  False\n",
       "213666611    False  False    False   False  False\n",
       "226500629     True  False    False   False  False\n",
       "230329140    False  False    False   False  False\n",
       "264162836    False  False    False   False  False"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用TransactionEncoder进行数据转换\n",
    "te = TransactionEncoder()\n",
    "te_ary = te.fit(transactions['items']).transform(transactions['items'])\n",
    "# 将转换后的数据集转换为DataFrame，并将player_id设置为行索引\n",
    "transaction_df = pd.DataFrame(te_ary, columns=te.columns_, index=transactions['player_id'])\n",
    "# 查看前五用户对前五商品的购买情况\n",
    "transaction_df.iloc[0:5,0:5] "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "b78df384",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "关联规则：\n",
      "Empty DataFrame\n",
      "Columns: [antecedents, consequents, antecedent support, consequent support, support, confidence, lift, leverage, conviction]\n",
      "Index: []\n"
     ]
    }
   ],
   "source": [
    "# 使用mlxtend的apriori函数获取频繁项集\n",
    "frequent_itemsets = apriori(transaction_df, min_support=0.2, use_colnames=True)\n",
    "# 使用mlxtend的association_rules函数获取关联规则\n",
    "rules = association_rules(frequent_itemsets, metric=\"confidence\", min_threshold=0.7)\n",
    "# 打印关联规则\n",
    "print(\"关联规则：\")\n",
    "print(rules)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "10f81050",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "关联规则：\n",
      "  antecedents consequents  antecedent support  consequent support   support  \\\n",
      "0   (70000金币)   (15000金币)            0.093250            0.185701  0.019194   \n",
      "1   (15000金币)      (8条钥匙)            0.185701            0.347249  0.040787   \n",
      "2     (20条钥匙)      (8条钥匙)            0.031670            0.347249  0.014075   \n",
      "3      (新手礼包)     (超值大礼包)            0.068298            0.017754  0.015995   \n",
      "4     (超值大礼包)      (新手礼包)            0.017754            0.068298  0.015995   \n",
      "5      (特殊滑板)     (限量版角色)            0.048944            0.117083  0.012796   \n",
      "6      (解锁滑板)     (限量版角色)            0.061420            0.117083  0.019194   \n",
      "\n",
      "   confidence       lift  leverage  conviction  \n",
      "0    0.205832   1.108407  0.001877    1.025349  \n",
      "1    0.219638   0.632510 -0.023697    0.836472  \n",
      "2    0.444444   1.279902  0.003078    1.174952  \n",
      "3    0.234192  13.190708  0.014782    1.282627  \n",
      "4    0.900901  13.190708  0.014782    9.401719  \n",
      "5    0.261438   2.232937  0.007065    1.195455  \n",
      "6    0.312500   2.669057  0.012003    1.284244  \n"
     ]
    }
   ],
   "source": [
    "# 最小支持度阈值设置为0.01，最小置信度阈值设置为0.1\n",
    "frequent_itemsets = apriori(transaction_df, min_support=0.01, use_colnames=True)\n",
    "rules = association_rules(frequent_itemsets, metric=\"confidence\", min_threshold=0.2)\n",
    "# 打印关联规则\n",
    "print(\"关联规则：\")\n",
    "print(rules)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "e64469a5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  antecedents consequents  antecedent support  consequent support   support  \\\n",
      "3      (新手礼包)     (超值大礼包)            0.068298            0.017754  0.015995   \n",
      "4     (超值大礼包)      (新手礼包)            0.017754            0.068298  0.015995   \n",
      "6      (解锁滑板)     (限量版角色)            0.061420            0.117083  0.019194   \n",
      "5      (特殊滑板)     (限量版角色)            0.048944            0.117083  0.012796   \n",
      "2     (20条钥匙)      (8条钥匙)            0.031670            0.347249  0.014075   \n",
      "0   (70000金币)   (15000金币)            0.093250            0.185701  0.019194   \n",
      "1   (15000金币)      (8条钥匙)            0.185701            0.347249  0.040787   \n",
      "\n",
      "   confidence       lift  leverage  conviction  \n",
      "3    0.234192  13.190708  0.014782    1.282627  \n",
      "4    0.900901  13.190708  0.014782    9.401719  \n",
      "6    0.312500   2.669057  0.012003    1.284244  \n",
      "5    0.261438   2.232937  0.007065    1.195455  \n",
      "2    0.444444   1.279902  0.003078    1.174952  \n",
      "0    0.205832   1.108407  0.001877    1.025349  \n",
      "1    0.219638   0.632510 -0.023697    0.836472  \n"
     ]
    }
   ],
   "source": [
    "#关联规则可以按lift排序\n",
    "rules.sort_values(by='lift',ascending=False,inplace=True)    \n",
    "print(rules)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "1663426b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 可视化关联规则\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签\n",
    "plt.scatter(rules['support'], rules['confidence'], alpha=0.5, marker=\"*\")\n",
    "plt.xlabel('支持度')\n",
    "plt.ylabel('置信度')\n",
    "plt.title('关联规则分析')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
